package material.encapsulation_algorithm.hook;

public abstract class CaffeinBeverageWithHook {
    void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        /**
         * 我们加上了一个的条件语句，而该条件是否成立，是由一个具体方法
         * customWantsCondiments决定的。如果顾客“想要”调料，只有这时我们才调用
         * addCondiments
         */
        if (customWantsCondiments()) {
            addCondiments();
        }
    }

    abstract void brew();

    abstract void addCondiments();

    void boilWater() {
        System.out.println("把水煮沸");
    }

    void pourInCup() {
        System.out.println("将饮料倒入杯子中");
    }

    /**
     * 我们在这里定义了一个方法，通常是空的缺省实现。这个方法只会返回true，不做别的事
     * 这就是一个钩子，子类可以覆盖这个，但不见得一定要去覆盖
     *
     * @return
     */
    boolean customWantsCondiments() {
        return true;
    }
}
